<!DOCTYPE HTML>
<html>
<head>
  <title>Media test: media selection</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <script type="application/javascript" src="manifest.js"></script>
</head>
<body>
<pre id="test">
<script class="testbody" type="text/javascript">
//longer timeout for sometimes B2G emulator runs very slowly
if (SpecialPowers.Services.appinfo.name == "B2G") {
  SimpleTest.requestLongerTimeout(3);
}

var manager = new MediaTestManager;

function maketest(attach_media, name, type, check_metadata) {
  return function (token) {
    var e = document.createElement('video');
    e.preload = "metadata";
    token = name + "-" + token;
    manager.started(token);
    var errorRun = false;
    if (check_metadata) {
      e.addEventListener('loadedmetadata', function () {
          ok(e.readyState >= HTMLMediaElement.HAVE_METADATA,
             'test ' +  token + ' readyState ' + e.readyState + ' expected >= ' + HTMLMediaElement.HAVE_METADATA);
          is(e.currentSrc.substring(e.currentSrc.length - name.length), name, 'test ' + token);
          // The load can go idle due to cache size limits
          ok(e.networkState >= HTMLMediaElement.NETWORK_IDLE,
              'test ' + token + ' networkState = ' + e.networkState + ' expected >= ' + HTMLMediaElement.NETWORK_IDLE);
          check_metadata(e);
          removeNodeAndSource(e);
          manager.finished(token);
        }, false);
    } else {
      e.addEventListener('error', function onerror(event) {
        is(errorRun, false, "error handler should run once only!");
        errorRun = true;
        is(e.readyState, HTMLMediaElement.HAVE_NOTHING,
           'test ' + token + ' readyState should be HAVE_NOTHING when load fails.');
        e.removeEventListener('error', onerror, true);
        removeNodeAndSource(e);
        manager.finished(token);
      }, true);
    }
    attach_media(e, name, type);
  }
}

function set_src(element, name, type) {
  element.src = name;
  document.body.appendChild(element);
}

function add_source(element, name, type) {
  do_add_source(element, name, type);
  document.body.appendChild(element);
}

function do_add_source(element, name, type) {
  var source = document.createElement('source');
  if (type) {
    source.type = type;
  }
  source.src = name;
  element.appendChild(source);
}

function add_sources_last(element, name, type) {
  do_add_source(element, name, 'unsupported/type');
  do_add_source(element, name, type);
  document.body.appendChild(element);
}

function add_sources_first(element, name, type) {
  do_add_source(element, name, type);
  do_add_source(element, name, 'unsupported/type');
  document.body.appendChild(element);
}

function late_add_sources_last(element, name, type) {
  document.body.appendChild(element);
  do_add_source(element, name, 'unsupported/type');
  do_add_source(element, name, type);
}

function late_add_sources_first(element, name, type) {
  document.body.appendChild(element);
  do_add_source(element, name, type);
  do_add_source(element, name, 'unsupported/type');
}

var nextTest  = 0;
var subtests = [
  maketest(add_source, 'unknown.raw', 'bogus/type', null)
];

var tmpVid = document.createElement('video');

for (var i = 0; i < gSmallTests.length; ++i) {
  var test = gSmallTests[i];
  var src = test.name;
  var type = test.type;

  if (!tmpVid.canPlayType(type))
    continue;

  // The following nested function hack is to ensure that 'test' is correctly
  // captured in the closure and we don't end up getting the value 'test'
  // had in the last iteration of the loop. I blame Brendan.
  var check = function(test) { return function (e) {
    checkMetadata(test.name, e, test);
  }}(test);

  var otherType = type.match(/^video\//) ? "audio/x-wav" : "video/ogg";
  subtests.push(maketest(set_src, src, null, check),
                maketest(add_source, src, null, check),
                maketest(add_source, src, type, check),
                maketest(add_sources_last, src, null, check),
                maketest(add_sources_first, src, type, check),

                // type hint matches a decoder, actual type matches different decoder
                maketest(add_source, src, otherType, check),
                maketest(add_source, 'unknown.raw', type, null),

                // should not start loading, type excludes it from media candiate list
                maketest(add_source, src, 'bogus/type', null),

                // element doesn't notice source children attached later, needs bug 462455 fixed
                maketest(late_add_sources_last, src, type, check),
                maketest(late_add_sources_first, src, type, check));
}

function startTest(test, token) {
  test(token);
}

manager.runTests(subtests, startTest);

</script>
</pre>
</body>
</html>
